home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / gfx / misc / MesaGL-aux.lha / src / xxform.c < prev   
C/C++ Source or Header  |  1998-09-12  |  2KB  |  135 lines

  1. /*
  2.  * xform.c 
  3.  */
  4.  
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include "GL/gl.h"
  8. #include "3d.h"
  9.  
  10. #define STACKDEPTH 10
  11.  
  12. typedef struct {
  13.   GLdouble mat[4][4];
  14.   GLdouble norm[3][3];
  15. } mat_t;
  16.  
  17. static mat_t matstack[STACKDEPTH] =
  18. {
  19.   {
  20.     {
  21.       {1.0, 0.0, 0.0, 0.0},
  22.       {0.0, 1.0, 0.0, 0.0},
  23.       {0.0, 0.0, 1.0, 0.0},
  24.       {0.0, 0.0, 0.0, 1.0}},
  25.     {
  26.       {1.0, 0.0, 0.0},
  27.       {0.0, 1.0, 0.0},
  28.       {0.0, 0.0, 1.0}}}
  29. };
  30. static int identitymat = 1;
  31.  
  32. static int mattop = 0;
  33.  
  34. void m_xformpt(GLdouble pin[3], GLdouble pout[3],
  35.            GLdouble nin[3], GLdouble nout[3])
  36. {
  37.   int i;
  38.   GLdouble ptemp[3], ntemp[3];
  39.   mat_t *m = &matstack[mattop];
  40.  
  41.   if (identitymat) {
  42.     for (i = 0; i < 3; i++) {
  43.       pout[i] = pin[i];
  44.       nout[i] = nin[i];
  45.     }
  46.     return;
  47.   }
  48.   for (i = 0; i < 3; i++) {
  49.     ptemp[i] = pin[0] * m->mat[0][i] +
  50.       pin[1] * m->mat[1][i] +
  51.       pin[2] * m->mat[2][i] +
  52.       m->mat[3][i];
  53.     ntemp[i] = nin[0] * m->norm[0][i] +
  54.       nin[1] * m->norm[1][i] +
  55.       nin[2] * m->norm[2][i];
  56.   }
  57.   for (i = 0; i < 3; i++) {
  58.     pout[i] = ptemp[i];
  59.     nout[i] = ntemp[i];
  60.   }
  61.   normalize(nout);
  62. }
  63.  
  64. void m_xformptonly(GLdouble pin[3], GLdouble pout[3])
  65. {
  66.   int i;
  67.   GLdouble ptemp[3];
  68.   mat_t *m = &matstack[mattop];
  69.  
  70.   if (identitymat) {
  71.     for (i = 0; i < 3; i++) {
  72.       pout[i] = pin[i];
  73.     }
  74.     return;
  75.   }
  76.   for (i = 0; i < 3; i++) {
  77.     ptemp[i] = pin[0] * m->mat[0][i] +
  78.       pin[1] * m->mat[1][i] +
  79.       pin[2] * m->mat[2][i] +
  80.       m->mat[3][i];
  81.   }
  82.   for (i = 0; i < 3; i++) {
  83.     pout[i] = ptemp[i];
  84.   }
  85. }
  86.  
  87. void m_pushmatrix(void)
  88. {
  89.   if (mattop < STACKDEPTH - 1) {
  90.     matstack[mattop + 1] = matstack[mattop];
  91.     mattop++;
  92.   }
  93.   else
  94.     error("m_pushmatrix: stack overflow\n");
  95. }
  96.  
  97. void m_popmatrix(void)
  98. {
  99.   if (mattop > 0)
  100.     mattop--;
  101.   else
  102.     error("m_popmatrix: stack underflow\n");
  103. }
  104.  
  105. void m_translate(GLdouble x, GLdouble y, GLdouble z)
  106. {
  107.   int i;
  108.   mat_t *m = &matstack[mattop];
  109.  
  110.   identitymat = 0;
  111.   for (i = 0; i < 4; i++)
  112.     m->mat[3][i] = x * m->mat[0][i] +
  113.       y * m->mat[1][i] +
  114.       z * m->mat[2][i] +
  115.       m->mat[3][i];
  116. }
  117.  
  118. void m_scale(GLdouble x, GLdouble y, GLdouble z)
  119. {
  120.   int i;
  121.   mat_t *m = &matstack[mattop];
  122.  
  123.   identitymat = 0;
  124.   for (i = 0; i < 3; i++) {
  125.     m->mat[0][i] *= x;
  126.     m->mat[1][i] *= y;
  127.     m->mat[2][i] *= z;
  128.   }
  129.   for (i = 0; i < 3; i++) {
  130.     m->norm[0][i] /= x;
  131.     m->norm[1][i] /= y;
  132.     m->norm[2][i] /= z;
  133.   }
  134. }
  135.